home *** CD-ROM | disk | FTP | other *** search
/ Nebula 1 / Nebula One.iso / Utilities / Unix / satan-1.1.1 / perl / facts.pl < prev    next >
Text File  |  1995-04-10  |  5KB  |  216 lines

  1. #
  2. # add_fact($record) add one record to the new facts list.
  3. #
  4. # process_facts() iterates over all new facts and generates new facts or
  5. # new todo items. It keeps looping until the new facts list becomes empty.
  6. #
  7. # save_facts($path) saves the old facts to the named file.
  8. #
  9. # read_facts($path) reads the old facts from the named file.
  10. #
  11. # merge_facts($path) merge with i-core tables.
  12. #
  13. # redo_old_facts() re-applies the todo/fact rules in case the probe
  14. # level or rule base have changed (or we would never see any effect
  15. # of changing todo/fact rules with already collected data).
  16. #
  17. # drop_old_facts() forgets all old facts we have about a host.
  18. #
  19. # Warning: all facts processing that invokes inference engines MUST set $_.
  20. #
  21. # version 1, Sun Mar 19  9:48:44 1995, last mod by zen
  22. #
  23.  
  24. #
  25. # Add one fact to the new facts list, with duplicate suppression.
  26. #
  27. sub add_fact {
  28.     local($fact) = @_;
  29.  
  30.     if (!exists($old_facts{$fact}) && !&drop_fact($fact) && !exists($new_facts{$fact})) { 
  31.         $new_facts{$fact} = 1;
  32.         print "Add-fact: $fact\n" if $debug;
  33.     }
  34. }
  35.  
  36. #
  37. # Iterate over the new facts list until nothing new shows up.
  38. #
  39. sub process_facts {
  40.     local(%temp_facts);
  41.  
  42.     while(&sizeof(*new_facts) > 0) {
  43.         %temp_facts = %new_facts;
  44.         %new_facts = ();
  45.         for (keys %temp_facts) {
  46.             if (&satan_split($_)) {
  47.                 warn "Ill-formatted fact: $_\n";
  48.                 next;
  49.             }
  50.             $old_facts{$_} = 1;
  51.             if ($status ne "u") {
  52.                 #
  53.                 # Stage 1: update the per-host tables. 
  54.                 #
  55.                 &infer_hosttype($_);
  56.                 &infer_services($_);
  57.                 &update_severities($_);
  58.                 &update_trust($_);
  59.  
  60.                 #
  61.                 # Stage 2: generate new probes and derive
  62.                 # new facts, using all information that
  63.                 # has been collected sofar.  Derive new
  64.                 # targets from trust relationships
  65.                 # (ignore localhost).
  66.                 #
  67.                 &infer_todo($_);
  68.                 &infer_facts($_);
  69.                 if (($trusted =~ /([^@]+)$/) && ($1 ne "ANY")
  70.                     && ($1 !~ /^localhost\.?/i)) {
  71.                     &new_target(&fix_hostname($1, $target),
  72.                         &get_proximity($target) + 1);
  73.                 }
  74.             }
  75.         }
  76.     }
  77. }
  78.  
  79. #
  80. # Save facts to named file.
  81. #
  82. sub save_facts {
  83.     local($path) = @_;
  84.  
  85.     open(FACTS, ">$path") || die "cannot save facts to $path: $!";
  86.     for (keys %old_facts) {
  87.         print FACTS "$_\n";
  88.     }
  89.     close(FACTS);
  90. }
  91.  
  92. #
  93. # Reset facts tables and derivatives
  94. #
  95. sub clear_facts {
  96.     %old_facts = ();
  97.     %new_facts = ();
  98.     &clear_hosttype_info();
  99.     &clear_service_info();
  100.     &clear_severity_info();
  101.     &clear_trust_info();
  102. }
  103.  
  104. #
  105. # Load facts from named file.
  106. #
  107. sub read_facts {
  108.     local($path) = @_;
  109.  
  110.     &clear_facts();
  111.     &merge_facts($path);
  112. }
  113.  
  114. #
  115. # Merge facts with in-core tables.
  116. #
  117. sub merge_facts {
  118.     local($path) = @_;
  119.  
  120.     open(FACTS, $path) || die "Cannot read facts file $path: $!";
  121.     print "Reading facts from $path...\n" if $debug;
  122.     while (<FACTS>) {
  123.         chop;
  124.         if (!exists($old_facts{$_})) {
  125.             if (&satan_split($_)) {
  126.                 warn "Warning - corrupted $path record: $_\n";
  127.                 next;
  128.             }
  129.             $old_facts{$_} = 1;
  130.             if ($status ne "u") {
  131.                 &infer_hosttype($_);
  132.                 &infer_services($_);
  133.                 &update_severities($_);
  134.                 &update_trust($_);
  135.                 &infer_facts($_);
  136.             }
  137.         }
  138.     }
  139.     &process_facts();
  140.     close(FACTS);
  141. }
  142.  
  143. #
  144. # Forget all old facts we have on a specific host.
  145. #
  146. sub drop_old_facts {
  147.     local($host) = @_;
  148.     local($fact, $target);
  149.  
  150.     for $fact (keys %old_facts) {
  151.         ($target) = split(/\|/, $fact);
  152.         if ($target eq $host) {
  153.             print "Deleting: $fact\n" if $debug;
  154.             delete $old_facts{$fact};
  155.         }
  156.     }
  157. }
  158.  
  159. #
  160. # Re-apply todo/fact rules in case attack level or rule base has changed.
  161. #
  162. sub redo_old_facts {
  163.  
  164.     for (keys %old_facts) {
  165.         &satan_split($_);
  166.         &infer_todo($_);
  167.         &infer_facts($_);
  168.     }
  169.     &process_facts();
  170. }
  171.  
  172. #
  173. # Some scaffolding code for stand-alone testing.
  174. #
  175. if ($running_under_satan) {
  176.     require 'perl/misc.pl';
  177.     require 'perl/fix_hostname.pl';
  178.     require 'perl/infer_todo.pl';
  179.     require 'perl/infer_facts.pl';
  180.     require 'perl/drop_fact.pl';
  181.     require 'perl/hosttype.pl';
  182.     require 'perl/services.pl';
  183.     require 'perl/severities.pl';
  184.     require 'perl/trust.pl';
  185. } else {
  186.     $running_under_satan = -1;
  187.     $debug = 1;
  188.  
  189.     require 'perl/misc.pl';
  190.     require 'perl/fix_hostname.pl';
  191.     require 'perl/infer_todo.pl';
  192.     require 'perl/infer_facts.pl';
  193.     require 'perl/drop_fact.pl';
  194.     require 'perl/hosttype.pl';
  195.     require 'perl/services.pl';
  196.     require 'perl/severities.pl';
  197.     require 'perl/trust.pl';
  198.  
  199.     warn "facts.pl running in stand-alone mode\n";
  200.  
  201.     eval "sub add_todo { local(\$target,\$tool,\$args) = \@_;
  202.         print \"add_todo: \$target,\$tool,\$args\\n\"; }\n";
  203.     eval "sub new_target { local(\$new,\$old) = \@_;
  204.         print \"new_target: \$new,\$old\\n\"; }\n";
  205.     print "Adding new facts...\n";
  206.     while (<>) {
  207.         chop;
  208.         &add_fact($_);
  209.     }
  210.  
  211.     print "Processing new facts...\n";
  212.     &process_facts();
  213. }
  214.  
  215. 1;
  216.